/**
 * 富文本内容处理工具
 * 主要用于处理图片尺寸适配问题
 */
class RichTextUtils {
  /**
   * 处理富文本内容，限制图片最大宽度
   * @param {string|Array} content - 富文本内容（HTML字符串或rich-text节点数组）
   * @param {Object} options - 配置选项
   * @param {string} options.maxWidth - 图片最大宽度，默认'100%'
   * @param {string} options.height - 图片高度，默认'auto'
   * @returns {string|Array} 处理后的内容
   */
  static processContent(content, options = {}) {
    const { maxWidth = '100%', height = 'auto' } = options

    if (!content) return content

    // 如果是字符串格式的HTML内容
    if (typeof content === 'string') {
      return this.processHtmlString(content, { maxWidth, height })
    }

    // 如果是rich-text nodes数组格式
    if (Array.isArray(content)) {
      return this.processRichTextNodes(content, { maxWidth, height })
    }

    return content
  }

  /**
   * 处理HTML字符串格式的内容
   * @param {string} htmlString - HTML字符串
   * @param {Object} options - 样式配置
   * @returns {string} 处理后的HTML字符串
   */
  static processHtmlString(htmlString, { maxWidth, height }) {
    return htmlString.replace(/<img([^>]*)>/gi, (match, attrs) => {
      // 检查是否已经有style属性
      if (attrs.includes('style=')) {
        // 如果有style属性，在其中添加或修改样式
        return match.replace(
          /style\s*=\s*["']([^"']*?)["']/gi,
          (styleMatch, styleContent) => {
            let newStyle = styleContent

            // 处理max-width
            if (newStyle.includes('max-width')) {
              newStyle = newStyle.replace(
                /max-width\s*:\s*[^;]+/gi,
                `max-width:${maxWidth}`
              )
            } else {
              newStyle += `;max-width:${maxWidth}`
            }

            // 处理height
            if (
              newStyle.includes('height') &&
              !newStyle.includes('max-height') &&
              !newStyle.includes('min-height')
            ) {
              newStyle = newStyle.replace(
                /(?<!max-|min-)height\s*:\s*[^;]+/gi,
                `height:${height}`
              )
            } else if (!newStyle.includes('height')) {
              newStyle += `;height:${height}`
            }

            return `style="${newStyle}"`
          }
        )
      } else {
        // 如果没有style属性，添加新的style属性
        return `<img${attrs} style="max-width:${maxWidth};height:${height};">`
      }
    })
  }

  /**
   * 处理rich-text nodes数组格式的内容
   * @param {Array} nodes - rich-text节点数组
   * @param {Object} options - 样式配置
   * @returns {Array} 处理后的节点数组
   */
  static processRichTextNodes(nodes, { maxWidth, height }) {
    const processNode = (node) => {
      if (typeof node === 'string') {
        return node
      }

      if (node.name === 'img') {
        const newNode = { ...node }
        if (!newNode.attrs) {
          newNode.attrs = {}
        }

        // 处理style属性
        let style = newNode.attrs.style || ''

        // 处理max-width
        if (style.includes('max-width')) {
          style = style.replace(
            /max-width\s*:\s*[^;]+/gi,
            `max-width:${maxWidth}`
          )
        } else {
          style += `;max-width:${maxWidth}`
        }

        // 处理height
        if (
          style.includes('height') &&
          !style.includes('max-height') &&
          !style.includes('min-height')
        ) {
          style = style.replace(
            /(?<!max-|min-)height\s*:\s*[^;]+/gi,
            `height:${height}`
          )
        } else if (!style.includes('height')) {
          style += `;height:${height}`
        }

        // 清理多余的分号
        style = style.replace(/^;+|;+$/g, '').replace(/;+/g, ';')

        newNode.attrs.style = style
        return newNode
      }

      // 递归处理子节点
      if (node.children && Array.isArray(node.children)) {
        return {
          ...node,
          children: node.children.map((child) => processNode(child))
        }
      }

      return node
    }

    return nodes.map((node) => processNode(node))
  }

  /**
   * 快捷方法：限制图片最大宽度为100%
   * @param {string|Array} content - 富文本内容
   * @returns {string|Array} 处理后的内容
   */
  static limitImageWidth(content) {
    return this.processContent(content, {
      maxWidth: '100%',
      height: 'auto'
    })
  }

  /**
   * 快捷方法：限制图片最大宽度为100vw（适合小程序全屏显示）
   * @param {string|Array} content - 富文本内容
   * @returns {string|Array} 处理后的内容
   */
  static limitImageWidthVw(content) {
    return this.processContent(content, {
      maxWidth: '100vw',
      height: 'auto'
    })
  }

  /**
   * 快捷方法：自定义图片尺寸
   * @param {string|Array} content - 富文本内容
   * @param {string} maxWidth - 最大宽度
   * @param {string} height - 高度
   * @returns {string|Array} 处理后的内容
   */
  static customImageSize(content, maxWidth = '100%', height = 'auto') {
    return this.processContent(content, { maxWidth, height })
  }
}

export default RichTextUtils
